package com.sprouting.ops.service;


import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sprouting.ops.dao.*;
import com.sprouting.ops.interfaces.ConstantBase;
import com.sprouting.ops.model.*;
import com.sprouting.ops.model.qo.AvailableDependQo;
import com.sprouting.ops.model.qo.OpsAppComputerServerQo;
import com.sprouting.ops.model.qo.OpsAppQo;
import com.sprouting.ops.model.vo.AppComputerVo;
import com.sprouting.ops.model.vo.AvailableDependVo;
import com.sprouting.ops.model.vo.OpsAppVo;
import com.sprouting.ops.utils.EntityTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * (应用项目表)表服务实现类
 *
 * @author longx
 * @since 2023-11-19 12:51:25
 */
@Service
@Slf4j
public class OpsAppService extends ServiceImpl<OpsAppDao, OpsApp> {

    @Resource
    private OpsAppDao opsAppDao;
    @Resource
    private OpsAppBranchDao opsAppBranchDao;
    @Resource
    private DromaraFileStorageDao dromaraFileStorageDao;
    @Resource
    private OpsCommonUseDao opsCommonUseDao;
    @Resource
    private OpsDeployDao opsDeployDao;
    @Resource
    private OpsProductDependDao opsProductDependDao;
    @Resource
    private OpsQuickAccessDao opsQuickAccessDao;



    /**
     * 根据项目id和名称查询应用
     * @param name 应用名称
     * @param id 过滤的id，非必填
     * @return
     */
    public OpsApp getByNameFilterId(String name, String id) {
        return opsAppDao.getByNameFilterId(name, id);
    }

    /**
     * 分页查询应用
     * @param page 分页参数
     * @param query 查询参数
     * @return
     */
    public Page<OpsAppVo> getOpsAppPageList(Page page, OpsAppQo query) {
        return opsAppDao.getOpsAppPageList(page, query);
    }

    /**
     * 保存应用和分支
     * @param opsApp 应用
     * @param unifiedFileInfo 应用图片
     * @param installList Markdown文档图片
     * @param branch 分支信息
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveOpsApp(OpsApp opsApp, DromaraFileStorage unifiedFileInfo, List<DromaraFileStorage> installList, OpsAppBranch branch) {
        // 应用
        opsAppDao.insert(opsApp);
        // 应用图标
        if (unifiedFileInfo != null){
            dromaraFileStorageDao.updateById(unifiedFileInfo);
        }
        // 应用的文档图片
        if (CollUtil.isNotEmpty(installList)){
            for (DromaraFileStorage dromaraFileStorage : installList) {
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
        // 分支
        opsAppBranchDao.insert(branch);
    }

    /**
     * 更新应用
     * @param opsApp 应用
     * @param uploadFileArray 上传的图片文件
     * @param installList Markdown的图片信息
     */
    @Transactional(rollbackFor = Exception.class)
    public void updOpsApp(OpsApp opsApp, DromaraFileStorage[] uploadFileArray, List<DromaraFileStorage> installList) {
        opsAppDao.updateById(opsApp);

        // 应用图标
        if (uploadFileArray[0] != null){
            // 新的
            dromaraFileStorageDao.updateById(uploadFileArray[0]);
        }
        if (uploadFileArray[1] != null){
            // 旧的文件
            dromaraFileStorageDao.updateById(uploadFileArray[1]);
        }

        // Markdown的图片信息
        if (CollUtil.isNotEmpty(installList)){
            for (DromaraFileStorage dromaraFileStorage : installList) {
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }

    /**
     * 删除应用
     * @param opsApp 应用
     * @param opsUploadFile 图片信息
     * @param installList Markdown的图片信息
     */
    @Transactional(rollbackFor = Exception.class)
    public void delOpsApp(OpsApp opsApp, DromaraFileStorage opsUploadFile, List<DromaraFileStorage> installList) {
        opsAppDao.deleteById(opsApp);

        if (opsUploadFile != null){
            dromaraFileStorageDao.updateById(opsUploadFile);
        }

        // 删除绑定关系
        LambdaUpdateWrapper<OpsProductDepend> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(OpsProductDepend::getBindId, opsApp.getId());
        opsProductDependDao.delete(wrapper);

        if (CollUtil.isNotEmpty(installList)){
            for (DromaraFileStorage dromaraFileStorage : installList) {
                dromaraFileStorage.setTempFile(ConstantBase.TempFile.PRODUCTION_DEL);
                dromaraFileStorage.setDelTime(new Date());
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }

        // 应用版本
        LambdaUpdateWrapper<OpsAppBranch> wrapperOpsAppBranch = new LambdaUpdateWrapper<>();
        wrapperOpsAppBranch.eq(OpsAppBranch::getAppId, opsApp.getId());
        opsAppBranchDao.delete(wrapperOpsAppBranch);

        // 常用文件和文件夹
        LambdaUpdateWrapper<OpsCommonUse> wrapperCommonUse = new LambdaUpdateWrapper<>();
        wrapperCommonUse.eq(OpsCommonUse::getBindId, opsApp.getId());
        opsCommonUseDao.delete(wrapperCommonUse);

        // 删除绑定关系？绑定关系的图片?环境？不删这么深

        // 删除快捷方式
        LambdaUpdateWrapper<OpsQuickAccess> wrapperQuickAccess = new LambdaUpdateWrapper<>();
        wrapperQuickAccess.eq(OpsQuickAccess::getBindId, opsApp.getId());
        opsQuickAccessDao.delete(wrapperQuickAccess);
    }

    /**
     * 查询产品可选依赖-应用
     * @param excludeList 排除的应用id
     * @param query 查询参数
     * @return
     */
    public Page<AvailableDependVo> getAvailableDepend(Page page, List<String> excludeList, AvailableDependQo query) {
        return opsAppDao.getAvailableDepend(page, excludeList, query);
    }

    /**
     * 根据ID批量查询应用
     * @param idList
     * @return
     */
    public List<OpsAppVo> getByIdList(List<String> idList) {
        return opsAppDao.getByIdList(idList);
    }

    /**
     * 根据产品id查询应用
     * @param productId 产品id
     * @return
     */
    public List<OpsAppVo> getAppByProductId(String productId) {
        return opsAppDao.getAppByProductId(productId);
    }

    /**
     * 根据计算机id查询应用信息
     * @param query 查询参数
     * @return
     */
    public Page<AppComputerVo> getAppByComputerId(Page page, OpsAppComputerServerQo query) {
        Page<AppComputerVo> computerVoPage = opsAppDao.getAppByComputerId(page, query);
        List<AppComputerVo> list = computerVoPage.getRecords();
        if (CollUtil.isEmpty(list)){
            return computerVoPage;
        }

        // 添加部署信息
        List<String> deployIdList = list.stream().map(AppComputerVo::getDeployId).collect(Collectors.toList());
        List<OpsDeploy> deployList = opsDeployDao.selectByIds(deployIdList);
        Map<String, OpsDeploy> map = EntityTool.toMap(deployList, OpsDeploy::getId);
        for (AppComputerVo appComputerVo : list) {
            appComputerVo.setOpsDeploy(map.get(appComputerVo.getDeployId()));
        }

        return computerVoPage;
    }

    /**
     * 获取可添加的应用
     * @param userId 当前用户id
     * @return
     */
    public List<OpsApp> getByQuickApp(String userId) {
        return opsAppDao.getByQuickApp(userId);
    }
}

